home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / memory / xms200je / doserror.cpp < prev    next >
C/C++ Source or Header  |  1993-11-22  |  3KB  |  95 lines

  1. //--------------------------------------------------------------------------
  2. //
  3. //      DOSERROR.CPP: body of DOS critical error/control-break handler.
  4. //      Copyright (c) J.English 1993.
  5. //      Author's address: je@unix.brighton.ac.uk
  6. //
  7. //      Permission is granted to use copy and distribute the
  8. //      information contained in this file provided that this
  9. //      copyright notice is retained intact and that any software
  10. //      or other document incorporating this file or parts thereof
  11. //      makes the source code for the library of which this file
  12. //      is a part freely available.
  13. //
  14. //--------------------------------------------------------------------------
  15. //
  16. //      Revision history:
  17. //      2.0     Nov 1993        Initial coding
  18. //
  19. //--------------------------------------------------------------------------
  20.  
  21. #include "doserror.h"
  22. #include <dos.h>
  23.  
  24. //--------------------------------------------------------------------------
  25. //
  26. //      Type declarations and static data.
  27. //
  28. typedef void interrupt (*Handler) (...);    // interrupt handler type
  29.  
  30. static DOSerror* instance = 0;              // current DOSerror instance
  31.  
  32.  
  33. //--------------------------------------------------------------------------
  34. //
  35. //      Control-break interrupt handler.
  36. //
  37. //      This calls the current instance's "controlBreak" member function.
  38. //
  39. void interrupt DOSerror::CtrlBreak ()
  40. {
  41.     instance->controlBreak ();
  42. }
  43.  
  44.  
  45. //--------------------------------------------------------------------------
  46. //
  47. //      Critical error interrupt handler.
  48. //
  49. //      This calls the current instance's "criticalError" member function.
  50. //      It also checks the return value to prevent ABORT being selected;
  51. //      anything other than IGNORE or RETRY will be interpreted as FAIL.
  52. //
  53. void interrupt DOSerror::Critical (unsigned, unsigned di, unsigned,
  54.                                    unsigned, unsigned,    unsigned,
  55.                                    unsigned, unsigned,    unsigned ax)
  56. {
  57.     ax = instance->criticalError (di & 0x00FF);
  58.     if (ax != IGNORE && ax != RETRY)
  59.         ax = FAIL;
  60. }
  61.  
  62. //--------------------------------------------------------------------------
  63. //
  64. //      DOSerror constructor.
  65. //
  66. //      This checks if there is an existing instance of a class derived
  67. //      from DOSerror; if not, the existing interrupt vectors are replaced.
  68. //      
  69. DOSerror::DOSerror ()
  70. {
  71.     oldInstance = instance;
  72.     instance = this;
  73.     oldCtrlBreak = getvect (0x23);
  74.     oldCritical = getvect (0x24);
  75.     setvect (0x23, Handler (CtrlBreak));
  76.     setvect (0x24, Handler (Critical));
  77. }
  78.  
  79.  
  80. //--------------------------------------------------------------------------
  81. //
  82. //      DOSerror destructor.
  83. //
  84. //      This checks if there is an existing instance of a class derived
  85. //      from DOSerror; if so, the original interrupt vectors are restored.
  86. //      The global "counter" is used to guard against nested instance
  87. //      scopes.
  88. //
  89. DOSerror::~DOSerror ()
  90. {
  91.     setvect (0x23, oldCtrlBreak);
  92.     setvect (0x24, oldCritical);
  93.     instance = oldInstance;
  94. }
  95.